#pragma once
#include "google/protobuf/service.h"
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>  
#include <muduo/net/TcpConnection.h>
#include <google/protobuf/descriptor.h>
#include <functional>
#include <string>
#include <unordered_map>

// 框架提供专门服务发布rpc服务的网络对象类
class RpcProvider
{
public:
    // 发布rpc服务方法接口
    void NotifyService(google::protobuf::Service* service);

    // 启动rpc节点
    void Run();

private:
    // 新连接回调
    void OnConnection(const muduo::net::TcpConnectionPtr& conn);
    // 读事件回调
    void OnMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp time);
    // Closure 回调操作，用于序列化rpc的响应和网络发送
    void SendRpcResponse(const muduo::net::TcpConnectionPtr& conn, google::protobuf::Message* response);

private:
    muduo::net::EventLoop m_eventloop;

    struct ServiceInfo {
        google::protobuf::Service* m_service;
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> m_methodMap; // 保存服务方法 【服务模块 【方法名 方法描述符】】
    };
    // 存储注册成功的服务对象和其服务方法的所有信息
    std::unordered_map<std::string, ServiceInfo> m_serviceMap;
};